2015-09-12 6 views
1

Недавно я недавно открыл проект, над которым я работал пару лет назад. Я написал небольшой скрипт python для создания проекта. Я хотел бы передать это вместо CMake.Fuse API и CMake Build

Проблема, с которой я столкнулась, заключается в том, что сценарий использует pkg-config для Linux, чтобы найти заголовки и библиотеки плавких предохранителей. У меня возникли проблемы с переносом на CMake.

Вот текущего Python скрипт

import subprocess, sys, os, shutil 

def call(command): 

    c = subprocess.Popen(command.split(), stdout=subprocess.PIPE) 
    c.wait() 
    return c.stdout.read() 

class GCC: 

    args = None 

    def __init__(self, initial_args): 

    self.args = initial_args 

    def addPKG(self, package): 

    self.args.extend(package) 

    def addFile(self, name): 

    self.args.append(name) 

    def compile(self, out_name): 

    self.args.extend(["-o", out_name]) 
    print " ".join(self.args) 
    gcc = subprocess.Popen(self.args) 
    return gcc.wait() == 0 


if __name__ == '__main__': 

    cflags = call("pkg-config fuse --libs --cflags").split() 

    print cflags 

    gcc = GCC(["gcc","-g","-Wall","-pg"]) 
    gcc.addFile("argsparse.c") 
    gcc.addFile("hidden.c") 
    #gcc.addFile("fs.c") 
    gcc.addFile("initialization.c") 
    gcc.addFile("resolve.c") 
    gcc.addFile("utilities.c") 
    gcc.addFile("winhomefs0.4.c") 
    gcc.addPKG(cflags) 
    gcc.addFile("-lulockmgr") 

    if gcc.compile("winhomefs") and 'install' in sys.argv: 
    if os.getuid() == 0: 
     shutil.copy("winhomefs", "/usr/local/bin/winhomefs") 

Вот мой текущий файл CMakeLists.txt.

cmake_minimum_required (VERSION 2.8.11) 
project (HomeFS) 

set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
    "${CMAKE_SOURCE_DIR}/CMakeModules/") 

find_package(FUSE REQUIRED) 

add_library(argsparse argsparse.c) 
add_library(hidden hidden.c) 
add_library(initialization initialization.c) 
add_library(resolve resolve.c) 
add_library(utilities utilities.c) 

add_executable(homefs winhomefs0.4.c) 

Проблема, с которой я столкнулся, состоит из части предохранителя. Я попробовал несколько различных перестановок нее включая следующие ...

https://github.com/tarruda/encfs/blob/master/CMakeModules/FindFUSE.cmake https://github.com/Pronghorn/pronghorn/blob/master/FindFUSE.cmake

Ни похоже на работу я получаю:

...argsparse.c:21:22: fatal error: fuse_opt.h: No such file or directory 
#include <fuse_opt.h> 
        ^
compilation terminated. 

Сценарий питон работает, однако, который предполагает, что есть что-то неправильно с настройкой cmake.

Для справки строка pkg-config выше выводит следующие данные в моей системе. -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -lfuse -pthread

Благодарим за помощь!


На обратной стороне Фрейзера Я обновил две вещи. Мой CMakeLists.txt теперь выглядит следующим образом:

cmake_minimum_required (VERSION 2.8.11) 
project (HomeFS) 

set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
    "${CMAKE_SOURCE_DIR}/CMakeModules/") 

find_package(FUSE REQUIRED) 

add_executable(homefs 
    argsparse.c 
    hidden.c 
    initialization.c 
    resolve.c 
    utilities.c 
    winhomefs0.4.c) 

set(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -lulockmgr") 

target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR}) 
target_link_libraries(homefs ${FUSE_LIBRARIES}) 

И все ссылки на <fuse.h> и <fuse_opt.h> были обновлены до <fuse/fuse.h> и так далее. Я также должен был добавить флаг -D_FILE_OFFSET_BITS=64, и теперь он компилируется чисто.

Однако я все еще получаю ошибку компоновщика.

winhomefs0.4.c:(.text+0x10b2): undefined reference to `ulockmgr_op' 
collect2: error: ld returned 1 exit status 

Я попытался добавить LIB -lulockmgr к С флагами, но это не работает. Google не был моим другом, поэтому очень мало ссылок на ulockmgr мне нужно реализовать модуль FindULOCKMGR CMake, или мне нужно добавить строку в другом месте?


Ok после нескольких проб и ошибок + логического мышления я решил вопрос мне нужно, чтобы переместить -lulockmgr строки из CFLAGS в target_link_libraries линии.

ответ

1

Возможно, вам просто не хватает пары вызовов в вашем файле CMakeLists.txt.

Линия find_package(FUSE REQUIRED) попытается найти путь к заголовкам FUSE и к FUSE lib (s). Блоки комментариев в верхней части двух файлов FindFUSE.cmake содержат сведения о том, какие переменные установлены. Возьмем, например, символы encfs. Он установит FUSE_FOUND в true или false, что позволит вам выйти из сценария с полезным сообщением об ошибке, если FUSE не найден.

Переменная FUSE_INCLUDE_DIR будет установлена ​​в абсолютный путь к папке, содержащей заголовок FUSE. FUSE_LIBRARIES будет установлен в список путей absoulte к файлам FUSE.

В настоящее время отсутствует в вашем файле CMakeLists.txt значение использует эти переменные.

Вы бы использовали их при звонках до target_include_directories и target_link_libraries - например.

target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR}) 
target_link_libraries(homefs ${FUSE_LIBRARIES}) 

Другая проблема заключается в том, что вы создаете пять отдельных библиотек с вашими пятью add_library звонков, но они не используются. По крайней мере, я ожидал увидеть, что они также связаны с exe через звонок target_link_libraries.

Я не знаю, Python достаточно хорошо, чтобы знать, что делает оригинальный сценарий, но я думаю, что более вероятным решением является то, что они все должны быть просто частью ехе:

add_library(argsparse argsparse.c) add_library(hidden hidden.c) add_library(initialization initialization.c) add_library(resolve resolve.c) add_library(utilities utilities.c) add_executable(homefs argsparse.c hidden.c initialization.c resolve.c utilities.c winhomefs0.4.c)

+0

Спасибо за обратной связи, теперь я могу скомпилировать код, но я все еще получаю ошибку компоновщика. Я обновил свой вопрос с более подробной информацией за ваши отзывы. –

+1

Ничего, я решил. Я уточню свой вопрос выше. –

Смежные вопросы