2013-05-28 44 views
2

我寫了一個(不那麼)小bash腳本來生成我一般makefile文件。 這些makefiles在開始時檢測主機體系結構,並以arch的名稱創建文件夾中的所有對象和輸出。cmake的 - 創建架構的makefile知道

它是這樣的:

uname_m = $(shell uname -m) 
DETECTED_ARCHITECTURE=$(uname_m) 
ifeq ($(ARCH), x86_64) 
    CFLAGS += -m64 
    LDFLAGS += -m64 
endif 
ifeq ($(ARCH), x86) 
    CFLAGS += -m32 
    LDFLAGS += -m32 
endif 
OUTPUT_DIR = $(DETECTED_ARCHITECTURE)/ 
OBJ_PREFIX_DIR = $(OUTPUT_DIR)objs/ 

因此,舉例來說,如果我跑讓我在我的工作電腦代碼,它的一切在家裏輸出到一個文件夾命名爲i686,到一個文件夾x86_64和上我的樹莓,armv6l。 此外,如果我做類似ARCH = i686的東西,它會正確地覆蓋檢測到的架構,以便它設置正確的編譯器選項和輸出目錄。 最終的輸出進入OUTPUT_DIR,所有生成的.o文件進入OUTPUT_DIR/objs。

我試圖做的cmake類似的東西。我看過CMake add_custom_command/_target in different directories for cross-compilationCMAKE output directory depending on generator architecture,但我不希望體系結構依賴於生成器。我希望它依賴於編譯機器。

例如,我的代碼在我的電腦,並進行編譯。如果一切順利,我將ssh發送到我的樹莓上,通過sshfs將我的電腦上的代碼文件夾掛載到樹莓上,然後在那裏編譯它。由於所有內容都轉到不同的文件夾(armv6l vs x86_64),所以沒有衝突,我不必重新生成makefile或clean,或者其他任何文件。

所以,基本上,是有可能的cmake告訴做出一個makefile架構知道? 感謝

+0

可能重複[如何使用CMake的檢測目標架構?](http://stackoverflow.com/questions/11944060/how-to-detect -target-architecture-using-cmake) –

回答

1

這是從以下電子郵件線程採取:Determine-32-vs-64-bit-cpu

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(arch_64 TRUE) 
else() 
    set(arch_64 FALSE) 
endif() 

而下面的警告給予

但是,請記住,在Mac OS X,這是 幾乎總是當您構建通用的 二進制文件時,這是錯誤的。所以,如果你的軟件應該在Mac上工作,你需要採取特別的預防措施。

我已經使用這個方法成功。

如果您不擔心蘋果,這應該爲你工作。如果您擔心Mac,則需要檢查您是否在Mac上,並使用「胖」二進制標誌而不是64和32標誌。

編輯

一個更好的答案就在這裏給出:https://stackoverflow.com/a/12024211/1399279

具體來說,檢查了他的CMake實現這個位置:https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake

+0

這是能夠正確猜測32位和64位之間。但是手臂呢?它只會落在32位的部分,並失敗。我的意圖是根據體系結構分離構建文件,而不僅僅是指針大小。我發佈的makefile片段就是這麼做的。我可以嘗試在cmake腳本中「注入」該makefile的片段,並將其包含在makefile的創建中。可能嗎? –

+0

@RhiakathFlanders嗯...我沒有想到這一點。不幸的是,據我所知,你不能通過你的CMakeLists.txt「注入」Makefile片段。看看這個答案一個相當迂迴的方法:http://stackoverflow.com/a/12024211/1399279 – SethMMorton

+0

可愛的小耶穌!那個人用cmake寫了聖經來檢測這個架構!但是這仍然不是我想要的...他能夠檢測cmake中的體系結構,但是我想在makefile中編譯(在編譯時)。我想這是不可能與cmake。 Cmake需要事先知道它將放置輸出的位置以及我想要的,是makefile決定放置它的位置。所以我可以通過sshfs共享代碼並使用「make」而不必重新創建makefile。所以我需要cmake將這個拱檢測注入到makefile中。 –